#pragma once
#include <iostream>
#include <cstring>
#include <string>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <sys/stat.h>
const std::string path = "/home/dyx/gitee/linux/ShareMemory";
int project_id = 0x666;
const int size = 1024;
class SharedMemory
{
private:
    void CreateHelper(int flags)
    {
        _key = ::ftok(path.c_str(), project_id);//获取共享内存的key
        if(_key == -1){
            std::cerr << "ftok error" << std::endl;
            return;
        }
        _shm_id = ::shmget(_key, size, flags);//创建共享内存(共享内存也有权限)
        if(_shm_id == -1){
            std::cerr << "shmget error" << std::endl;
            return;
        }
    }

public:
    SharedMemory():_key(-1), _shm_id(-1), _shm_ptr(nullptr)
    {}
    void CreateShm() // 创建共享内存
    {
        if(_shm_id == -1){
            CreateHelper(IPC_CREAT | IPC_EXCL | 0666);
        }
    }
    void GetShm()// 获取共享内存
    {
        CreateHelper(IPC_CREAT);
    }
    void AttachShm() // 挂接共享内存
    {
        _shm_ptr = ::shmat(_shm_id, nullptr, 0); // 映射共享内存
        if (_shm_ptr == (void *)-1){
            std::cerr << "shmat error" << std::endl;
            return;
        }
    }
    void DetachShm()// 解挂共享内存
    {          
        if(_shm_ptr!= nullptr)           
            ::shmdt(_shm_ptr); // 解除映射
    }
    void RemoveShm()//删除共享内存
    {                                        
        ::shmctl(_shm_id, IPC_RMID, nullptr); // 删除共享内存
    }
    void* GetShmPtr() 
    { 
        return _shm_ptr; 
    }
    ~SharedMemory() {}

private:
    key_t _key;
    int _shm_id;
    void *_shm_ptr;
};
SharedMemory shm;